<?php if ( ! defined('FCPATH')) exit('No direct script access allowed');
/**
* Gestion du montage HTML d'une page
* @author Richard G
* @package Layout
*/
class Layout
{

	private $views;
	private $CI;
	private $param_ajax = null;
	private $img_dir;
	private $data_header = array();
	private $dir_css = "/statics/css/";
	private $dir_js = "/statics/js/";

	/**
	* Construit un contenu
	*/
	public function __construct()
	{
		$this->CI =& get_instance();
		$this->CI->load->helper(array('url', 'my_html', 'file'));
		$this->views = array();

		$this->CI->config->load('layout', true, true);

		#Liste des fichiers javascript a ajouter dans le header
		$this->views['aJS'] = array();

		#Liste des fichiers css a ajouter dans le header
		$this->views['aCSS'] = array();

		#Liste des fichiers javascript dans le fichier de config
		$this->addJS($this->CI->config->item('js', 'layout'));

		#Liste des fichiers CSS dans le fichier de config
		$this->addCSS($this->CI->config->item('css', 'layout'));

		#Liste des meta a ajouter dans le header
		$this->views['meta'] = $this->CI->config->item('meta', 'layout');
		$this->views['meta'] = is_array($this->views['meta']) ?
									$this->views['meta'] : array();

		#Liste des fichiers css a ajouter dans le header
		$this->views['sTitle'] = $this->CI->config->item('title', 'layout');
		$this->views['sTitle'] = !empty($this->views['sTitle']) ?
						$this->views['sTitle'] : "Bienvenue sur mon site web";
		$this->views['sTitleHTML'] = $this->views['sTitle'];

		#Liste des vues utilise pour le header
		$this->views['header'] = array();

		#Liste des vues utilise pour le contenu de la page
		$this->views['content'] = array();

		#Liste des vues utilise pour le footer
		$this->views['footer'] = array();

		#Chemin pour les images
		$this->img_dir = $this->CI->config->item('img_dir', 'layout');
		$bFileLayout = true;

		#Verifie que le template pour le header existe
		if(!file_exists(FCPATH.APPPATH."/views/layout/header.php")) {
			echo '<div style="color:#F00;font-weight:bold;">'.
				 'Le fichier header.php nécessaire au layout n\'est pas '.
				 'disponible</div>';
			$bFileLayout = false;
		}

		#Verifie que le template pour le footer existe
		if(!file_exists(FCPATH.APPPATH."/views/layout/footer.php")) {
			echo '<div style="color:#F00;font-weight:bold;">Le fichier '.
				 'footer.php nécessaire au layout n\'est pas disponible</div>';
			$bFileLayout = false;
		}

		if(!$bFileLayout) exit();
	}

	/**
	* Ajoute un fichier CSS
	* @param string $oFile Fichier CSS ou des fichiers CCS a ajouter, si false :
	* 	réinitialise le tableau des CSS
	*/
	public function addCSS($oFile)
	{
		if($oFile === false)  $this->views['aCSS'] = array();
		if(is_array($oFile)) {
			foreach($oFile as $sFile) {
				$this->addCSS($sFile);
			}
		}else {
			if(file_exists(FCPATH.$this->dir_css.ENVIRONMENT."/".$oFile)) {
				$this->views['aCSS'][] = base_url().$this->dir_css.ENVIRONMENT.
										"/".$oFile;
			}elseif(file_exists(FCPATH.$this->dir_css.$oFile)) {
				$this->views['aCSS'][] = base_url().$this->dir_css.$oFile;
			}
		}
	}

	/**
	* Ajoute un fichier javascript
	* @param string $oFile Fichier javascript ou des fichiers javascripts a
	*	ajouter, si false : réinitialise le tableau des JS
	*/
	public function addJS($oFile)
	{
		if($oFile === false)  $this->views['aCSS'] = array();
		if(is_array($oFile)) {
			foreach($oFile as $sFile) {
				$this->addJS($sFile);
			}
		}else {
			if(file_exists(FCPATH.$this->dir_js.ENVIRONMENT."/".$oFile)) {
				$this->views['aJS'][] = base_url().$this->dir_js.ENVIRONMENT.
										"/".$oFile;
			}elseif(file_exists(FCPATH.$this->dir_js.$oFile)) {
				$this->views['aJS'][] = base_url().$this->dir_js.$oFile;
			}
		}
	}

	/**
	* Prépare le header du contenu
	* @param string $sTitle Titre de votre page
	* @param array $aData tableau des valeurs a passe a la vue
	*/
	public function header($sTitle = "", $aData = null)
	{
		if(!empty($sTitle)) $this->views['sTitle'] = $sTitle;
		if(empty($aData)) $aData = array();
		$aData = $aData+array('sTitle'=>$this->views['sTitle'], 'aJS'=>array(),
						'aCSS'=>array());
		$this->views['header']['header'] =
					array('view'=>'layout/header.php', 'data'=>$aData);
		if(file_exists(FCPATH.APPPATH."/views/layout/menu.php")) {
			$this->views['header']['menu'] =
					array('view'=>'layout/menu.php', 'data'=>array());
		}
	}

	/**
	* Assigner le titre de la pafge
	* @param string $sTitle Titre de votre page
	*/
	public function setTitle($sTitle, $sTitleHTML = "")
	{
		$this->views['sTitle'] = $sTitle;
		$this->views['sTitleHTML'] = $sTitleHTML ? $sTitleHTML : $sTitle;
	}

	/**
	* Modifie le type de retour
	* @param string $sType Type de retour ajax
	*/
	public function headerData($sData)
	{
		$this->data_header += $sData;
	}

	/**
	* Prépare le header du contenu pour une action ajax
	* @param string $mixed Le contenu à retourner
	* @param string $sType Type de retour ajax, parametre optionnel
	*	(valeur par defaut : application/json)
	*/
	public function dataAjax($mixed, $type = 'application/json')
	{
		// Verifie que le template pour le header ajax existe
		$this->param_ajax = array('type'=>$type, 'content' => $mixed);
	}

	/**
	* Ajoute un template avec ses datas pour le contenu de la page
	* @param string $sView Nom du template a utilisé
	* @param array $aData les variables a passer à la fonction view, parametre
	* @param array $aHelpers, liste des helpers qui seront utilsé pour la vue
	*	optionnel (valeur par defaut : array)
	*/
	public function content($sView, $aData = array(), $aHelpers = array())
	{
		$this->CI->load->helper($aHelpers);
		$this->views['content'][] = array('view'=>$sView, 'data'=>$aData);
	}

	/**
	* Prepare le contenu pour le footer
	* @param array $aData les variables a passer à la fonction view, parametre
	*	optionnel (valeur par defaut : array)
	*/
	public function footer($aData = array())
	{
		$this->views['footer'] =
			array('view'=>'layout/footer.php', 'data'=>$aData);
	}

	/**
	* Genere le contenu HTML a retourner a l'utilisateur
	*/
	public function makeContent()
	{
		// Prépare le contenu de la page, qu'on place dans une variable
		$sHeader = "";
		$sContent = "";
		$sFooter = "";
		$init_data = array();

		// Retour ajax
		if($this->param_ajax && is_array($this->param_ajax)) {
			$content = strpos($param_ajax['type'], 'json') !== false ?
				json_encode($param_ajax['content']) : $param_ajax['content'];
			$this->CI->output
     			->set_content_type($param_ajax['type'])
    			->set_output($content);
    		exit();
		}

		// Liste des vues a ajouter dans le contenu de la page
		if(!empty($this->views['content'])) {
			foreach($this->views['content'] as $aView) {
				$data = $aView['data']+$init_data;
				$sContent .=
					$this->CI->load->view($aView['view'], $data, true);
			}
		}
		unset($aView);

		// Verifie que le header a ete charge
		if(empty($this->views['header'])) {
			$this->header();
		}

		// Affichage du header
		if(isset($this->views['header']['header'])) {
			// Plusieurs vues a ajouter pour le header
			foreach($this->views['header'] as $aView) {
				if(isset($aView['data']['aJS']))
					$aView['data']['aJS'] = $this->views['aJS'];
				if(isset($aView['data']['aCSS']))
					$aView['data']['aCSS'] = $this->views['aCSS'];
				$aView['data']['title'] = $this->views['sTitle'];
				$aView['data']['title_html'] = $this->views['sTitleHTML'];
				$aView['data'] += $this->data_header;
				$aView['data'] += $init_data;
				$sHeader =
					$this->CI->load->view($aView['view'], $aView['data'], true);
			}
		}elseif(isset($this->views['header']['view'])) {
			// Une seule vue a ajouter pour le header
			$this->views['header']['data'] += $this->data_header;
			$this->views['header']['data'] += $init_data;
			$this->views['header']['data']['title'] = $this->views['sTitle'];
			$this->views['header']['data']['title_html'] =
												$this->views['sTitleHTML'];
			$sHeader = $this->CI->load->view(
									$this->views['header']['view'],
									$this->views['header']['data'],
									true
								);
		}elseif(isset($this->views['header']['ctType'])) {
			// Aucune vue a ajouter, on utilie la fonction header pour
			// 	affecter le type a retourner
			header("Content-Type:".$this->views['header']['type']);
		}
		unset($aView);

		// Affichage du footer
		if(!empty($this->views['footer'])) {
			$aView = $this->views['footer']['data'];
			$aView += $init_data;
			$sFooter =
				$this->CI->load->view($this->views['footer']['view'], $aView);
		}

		// Affichage du contenu
		echo $sHeader.$sContent.$sFooter;
	}

	/**
	* Retourne l'url d'une image
	* @param String le chemin de l'image
	*/
	public function urlImg($sImage = "")
	{
		return base_url().$this->img_dir.$sImage;
	}

	/**
	* Genere une balise image
	* @param objet String url image or Array properties image
	*/
	public function img($oImage)
	{
		if(is_array($oImage)) {
			$oImage['src'] = $this->img_dir.$oImage['src'];
		}else {
			$oImage = array('src'=>$this->img_dir.$oImage, 'alt'=>$oImage,
							'title'=>$oImage);
		}
		return img($oImage);
	}

	/**
	* Genere une balise image avec le loader
	* @param Bool si on doit afficher la grande barre de loader
	* @param String Titre de l'image
	* @param Bool si l'image doit être affiché
	* @param Array Autre paramètre a utiliser
	*/
	public function imgLoader($bBig = false, $sTitle = "Veuillez patienter", $bDisplay = true, $aOtherParam = array())
	{
		$aImgLoader = $aOtherParam;
		$aImgLoader['src'] = 'ajax-loader.gif';
		if($bBig === true) {
			$aImgLoader['src'] = 'ajax-loader-big.gif';
		}
		$aImgLoader['alt'] = !empty($aImgLoader['alt']) ?
									$aImgLoader['alt'] : $sTitle;
		$aImgLoader['title'] = !empty($aImgLoader['title']) ?
									$aImgLoader['title'] : $sTitle;
		if($bDisplay === false) {
			$aImgLoader['style'] = !empty($aImgLoader['style']) ?
					$aImgLoader['style'].';display:none;' : 'display:none;';
		}
		return $this->img($aImgLoader);
	}

}